<!DOCTYPE HTML>
<html>
<head>
<title>RegRead | AutoHotkey</title>
<meta name="description" content="The RegRead command reads a value from the registry." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>RegRead</h1>
<p>从注册表读取值.</p>

<h2 id="new">新语法 <span class="ver">[v1.1.21+]</span></h2>
<pre class="Syntax"><span class="func">RegRead</span>, OutputVar, KeyName <span class="optional">, ValueName</span></pre>

<h3>参数</h3>
<dl>

  <dt>OutputVar</dt>
  <dd><p>用来存储获取值的变量名. 如果值无法获取, 则变量被置空且 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被设为 1.</p></dd>

  <dt>KeyName</dt>
  <dd><p>注册表键的全名.</p>
      <p>必须以 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT 或 HKEY_CURRENT_CONFIG(或这些的缩写, 如 HKLM) 开始. 要访问<a href="LoopReg.htm#remote">远程注册表</a>, 请在前面加上计算机名和冒号(或在 <span class="ver">[v1.1.21+]</span>, 可用斜杠 / 或 \), 就像在本例中一样: <code>\\workstation01:HKEY_LOCAL_MACHINE</code>, 或 <span class="ver">[v1.1.21+]</span> <code>\\workstation01\HKEY_LOCAL_MACHINE</code></p></dd>

  <dt>ValueName</dt>
  <dd><p>要获取值的名称. 如果省略, 则获取 <em>KeyName</em> 的默认值, 这是在注册表中值名显示为 "(默认)" 的值. 如果没有默认值(即注册表中显示 "数值未设置"), 则将 <em>OutputVar</em> 置空且 ErrorLevel 设置为 1.</p></dd>

</dl>

<h2 id="old">传统语法</h2>
<p class="warning"><strong>过时的:</strong> 不推荐在新脚本中使用此语法. 请使用<a href="#new">新语法</a>.</p>
<pre class="Syntax"><span class="func">RegRead</span>, OutputVar, RootKey, SubKey <span class="optional">, ValueName</span></pre>

<h3 id="Old_Parameters">参数</h3>
<dl>

  <dt>OutputVar</dt>
  <dd><p>用来存储获取值的变量名. 如果无法获取, 则变量被置空且 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被设置为 1.</p></dd>

  <dt>RootKey</dt>
  <dd><p>必须为 HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT 或 HKEY_CURRENT_CONFIG 的其中一个(或者它们的缩写, 例如 HKLM). 要访问远程注册表, 请在前面加上计算机名和冒号(或在 <span class="ver">[v1.1.21+]</span> 可用斜杠 / 或 \), 就像在本例中一样: <code>\\workstation01:HKEY_LOCAL_MACHINE</code>, 或 <span class="ver">[v1.1.21+]</span> <code>\\workstation01\HKEY_LOCAL_MACHINE</code></p></dd>

  <dt>SubKey</dt>
  <dd><p>子键名(例如 Software\SomeApplication).</p></dd>
  
  <dt>ValueName</dt>
  <dd><p>要获取的值名. 如果省略, 则获取 <em>Subkey</em> 的默认值, 这是在注册表中值名显示为 "(默认)" 的值. 如果没有默认值(即注册表中显示 "数值未设置"), 则 <em>OutputVar</em> 置空且 ErrorLevel 设置为 1.</p></dd>

</dl>

<h2 id="Error_Handling">错误处理</h2>
<p><span class="ver">[v1.1.04+]</span>: 此命令失败时会抛出异常. 想了解更多信息, 请参阅<a href="Catch.htm#RuntimeErrors">运行时错误</a>.</p>
<p>如果遇到问题(例如不存在的键或值名), 则 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被设置为 1, 否则为 0.</p>
<p><a href="../Variables.htm#LastError">A_LastError</a> 被设置为操作系统 GetLastError() 函数返回的结果.</p>

<h2 id="Remarks">备注</h2>
<p>目前只支持下列这些值类型: REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD 以及 REG_BINARY.</p>
<p>REG_DWORD 值总是被转换为正十进制数. 如果该数字是负数, 则使用 <code>OutputVar := OutputVar &lt;&lt; 32 &gt;&gt; 32</code> 或类似的方法将其转换为有符号的 32 位整数.</p>
<p>读取 REG_BINARY 键时, 获取的结果为十六进制字符的字符串. 例如, REG_BINARY 类型的值 01, a9, ff, 77 的读取结果为字符串 01A9FF77.</p>
<p>读取 REG_MULTI_SZ 键时, 值的每个部分会以换行符结束(`n). 如果值为空, 则 <em>OutputVar</em> 会被置空. 请参阅 <a href="FileSelectFile.htm">FileSelectFile</a> 中的示例了解如何从 <em>OutputVar</em> 中逐个提取单独的部分.</p>
<p><span class="ver">[v1.1.10.01+]</span>: 大于 64K 的 REG_BINARY 值可以被读取.</p>
<p>要获取和操作多个注册表键或值, 请考虑使用<a href="LoopReg.htm">注册表循环</a>.</p>
<p>关于如何访问远程计算机注册表的详情, 请参阅<a href="LoopReg.htm">注册表循环</a>中的备注.</p>
<p>要在 32 位脚本中读写注册表 64 位部分的条目或进行相反的操作, 请使用 <a href="SetRegView.htm">SetRegView</a>.</p>

<h2 id="Related">相关</h2>
<p><a href="RegDelete.htm">RegDelete</a>, <a href="RegWrite.htm">RegWrite</a>, <a href="LoopReg.htm">注册表循环</a>, <a href="SetRegView.htm">SetRegView</a>, <a href="IniRead.htm">IniRead</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExNewVsOld">
<p><a class="ex_number" href="#ExNewVsOld"></a> 新语法 vs. 旧语法.</p>
<p>尽管语法不同, 但这两个例子的效果是一样的, 它们从注册表中读取一个值并将其存储在 <var>OutputVar</var>.</p>
<pre>RegRead, OutputVar, HKEY_LOCAL_MACHINE\Software\SomeApplication, TestValue</pre>
<pre>RegRead, OutputVar, HKEY_LOCAL_MACHINE, Software\SomeApplication, TestValue</pre>
</div>

<div class="ex" id="ExProgramFiles">
<p><a class="ex_number" href="#ExProgramFiles"></a> 检索并报告 "Program Files" 目录的路径. 有关另一种方法, 请参阅 <a href="EnvGet.htm#ExProgramFiles">EnvGet 示例 #2</a>.</p>
<pre><em>; 此行确保在 64 位系统上运行非 64 位脚本时也能正常返回 64 位的 Program Files 目录路径.</em>
<a href="SetRegView.htm">SetRegView</a> 64  <em>; Requires <span class="ver">[v1.1.08+]</span></em>

RegRead, OutputVar, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion, ProgramFilesDir
MsgBox, Program files are in: %OutputVar%</pre>
</div>

<div class="ex" id="ExType">
<p><a class="ex_number" href="#ExType"></a> 获取注册表值的类型(例如 REG_SZ 或 REG_DWORD).</p>
<pre>MsgBox % RegKeyType("HKCU", "Environment", "TEMP")
return

RegKeyType(RootKey, SubKey, ValueName)  <em>; 此函数返回指定值的类型.</em>
{
    Loop, %RootKey%, %SubKey%
        if (A_LoopRegName = ValueName)
            return A_LoopRegType
    return "Error"
}</pre>
</div>

</body>
</html>